# 网站上有各种各样的图，直接copy进行修改。
# https://matplotlib.org/gallery/index.html
import math

import numpy as np
# 导入 matplotlib 的所有内容（nympy 可以用 np 这个名字来使用）
from pylab import *


# 导入 matplotlib 的内容以plt来使用
# import matplotlib.pyplot as plt
# import numpy as np


def sinImage():
    # 创建一个 8 * 6 点（point）的图，并设置分辨率为 80
    plt.figure(figsize=(8, 5), dpi=80)

    # 创建一个新的 1 * 1 的子图，接下来的图样绘制在其中的第 1 块（也是唯一的一块）
    # ax = subplot(1, 1, 1)
    # 设置坐标轴，坐标轴线和上面的记号连在一起就形成了脊柱（Spines，一条线段上有一系列的凸起，
    # 是不是很像脊柱骨啊~），它记录了数据区域的范围。它们可以放在任意位置，不过至今为止，
    # 我们都把它放在图的四边。
    ax = gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))

    # X 是一个 numpy 数组，包含了从 −π 到 +π 等间隔的 256 个值
    x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
    y = np.sin(x)

    # k-:黑色实线   r-:红色实线   b--：宽度为 3 （像素）的线条
    plt.plot(x, y, "k-", label="$sin(x)$", linewidth=3)
    # 在图的左上角添加一个图例
    legend(loc='upper left')

    # 在2π / 3的位置给两条函数曲线加上一个注释
    t = 2 * np.pi / 3
    plot([t, t], [0, np.sin(t)], color='black', linewidth=2.5, linestyle="--")
    scatter([t, ], [np.sin(t), ], 50, color='black')

    annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
             xy=(t, np.sin(t)), xycoords='data',
             xytext=(+10, +30), textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

    xmin, xmax = x.min(), x.max()
    ymin, ymax = y.min(), y.max()
    dx = (xmax - xmin) * 0.2
    dy = (ymax - ymin) * 0.2
    # 设置横轴的上下限
    xlim(xmin - dx, xmax + dx)
    # 设置纵轴的上下限
    ylim(ymin - dy, ymax + dy)

    # 设置横轴记号
    xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi],
           [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
    # 设置纵轴记号
    yticks([-1, 0, +1],
           [r'$-1$', r'$0$', r'$+1$'])

    # 以分辨率 72 来保存图片
    # savefig("exercice_2.png",dpi=72)

    # 图像标题
    plt.title("PyPlot First Example")

    # 在屏幕上显示
    plt.show()


def cosImage():
    x = np.linspace(0, np.pi * 2, 256, endpoint=True)
    y = np.cos(x)

    plt.plot(x, y, "b--", label="$sin(x)$", linewidth=3)

    plt.show()

    # plt.xlabel("Times(s)")
    # plt.ylabel("Volt")
    # plt.title("PyPlot First Example")
    # plt.legend()  # 图例
    # plt.show()


def xImage():
    # 创建一个新的 1 * 1 的子图，接下来的图样绘制在其中的第 1 块（也是唯一的一块）
    ax = subplot(1, 1, 1)

    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))

    # X 是一个 numpy 数组，包含了从 −π 到 +π 等间隔的 256 个值
    x = np.linspace(-10, 10, 100, endpoint=True)
    y = x

    # r-:红色实线   b--：宽度为 3 （像素）的线条
    plt.plot(x, y, "r-", label="y=x", linewidth=3)
    # 在图的左上角添加一个图例
    legend(loc='upper left')

    xmin, xmax = x.min(), x.max()
    ymin, ymax = y.min(), y.max()
    dx = (xmax - xmin) * 0.2
    dy = (ymax - ymin) * 0.2
    # 设置横轴的上下限
    xlim(xmin - dx, xmax + dx)
    # 设置纵轴的上下限
    ylim(ymin - dy, ymax + dy)

    # 图像标题
    plt.title("x函数")

    # 在屏幕上显示
    plt.show()


def logImage():
    # 创建一个新的 1 * 1 的子图，接下来的图样绘制在其中的第 1 块（也是唯一的一块）
    ax = subplot(1, 1, 1)

    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))

    # X 是一个 numpy 数组，包含了从 −π 到 +π 等间隔的 256 个值
    x = np.linspace(0, 10, 1000, endpoint=True)
    y = np.log2(x)

    # r-:红色实线   b--：宽度为 3 （像素）的线条
    plt.plot(x, y, "r-", label="y=log2(x)", linewidth=3)
    # 在图的左上角添加一个图例
    legend(loc='upper left')

    # 图像标题
    plt.title("x函数")

    # 在屏幕上显示
    plt.show()


# cosImage()
sinImage()
# xImage()
# logImage()
